#include "comfunc.h"


/***************************************************************
函数名：checksum
描  述：和校验
输入值：*data 数据指针 len 数据长度
输出值：无
返回值：uint8 cs
***************************************************************/
uint8 checksum(uint8 *data,uint8 len)
{
    uint8 cs = 0;

    while(len-- > 0)
        cs += * data++;
    return(cs);
}

/*
 * 功能： 字节数组转换为带空格的hex字符串
 * 例如：输入ByteArray=
 *
 *
*/
QString byte_num_to_hex_string_with_space(QByteArray &ByteArray)
{
   
    QString frame_hex_str = QString(ByteArray.toHex()).toUpper();

    for(int i= frame_hex_str.count()-2;i>=2;i-=2)
    {
        frame_hex_str.insert(i,' ');
    }
    return frame_hex_str;
}

/*
 * 功能： 字节数组转换为带空格的hex字符串
 * 例如：输入ByteArray=
*/
QString byte_num_to_hex_string_with_space(uint8 *data, int len)
{
    QString frame_hex_str;

    for(uint8 i=0;i<len;i++)
    {
        frame_hex_str += QString("%1 ").arg(data[i],2,16,(QChar)'0').toUpper();
    }
    return frame_hex_str;
}
/*
 * 功能： 字节数组转换为带空格的hex字符串，可设置转换后的方向
 * 例如：输入ByteArray=
*/
QString byte_num_to_hex_string_with_space(uint8 *data, int len, bool direction_is_forward)
{
    QString frame_hex_str;

    for(uint8 i=0;i<len;i++)
    {
        if(true == direction_is_forward)
        {
            frame_hex_str += QString("%1 ").arg(data[i],2,16,(QChar)'0').toUpper();
        }
        else
        {
            frame_hex_str += QString("%1 ").arg(data[len-1-i],2,16,(QChar)'0').toUpper();
        }

    }
    //qDebug()<<"数组转HEX字符串"<<frame_hex_str;
    return frame_hex_str;
}
/*
 * 数字转bcd
 */
void DectoBCD(int Dec, unsigned char *Bcd, int length)
{
     int i;
     int temp;

    for(i=length-1; i>=0; i--)
    {
         temp = Dec%100;
         Bcd[i] = ((temp/10)<<4) + ((temp%10) & 0x0F);
         Dec /= 100;
    }

}
uint8 bin2bcd(uint8 bin_byte)
{
    return ((((bin_byte) / 10) << 4) + (bin_byte) % 10)	;
}

/*
功能：把十进制数value转换为小端bcd
举例：hex2bcd(1234, buf, 4),执行后buf变为{0x34,,0x12,0x00,0x00}
*/
void hex2bcd_le(quint32 value, uint8_t *bcd, uint8 bytes)
{
    uint8_t x;

    while (bytes--)
    {
        x = value % 100u;
        *bcd = bin2bcd(x);
        bcd++;
        value /= 100u;
    }
}
void memadd(void* dest, char data, int  len)
{
    while(len--)
    {
         ((uint8 *)dest)[len] += data;
    }
}
/*
 * 功能：hex字符串转为字节数组，hex字符串两个字符代表一个字节的HEX值，空格可带可不带
 * 参数：转换后的数组正向还是反向direction_is_forward=true
 * 返回：转换后的数组的长度，若出错，返回负值
 * 举例：若direction_is_forward=true，str="03 04AB 5f"，转换后byte_arr变为{0x03,0x04,0xAB,0x5F},返回4
 *      若direction_is_forward=false，str="03 04AB 5f"，转换后byte_arr变为{0x5f, 0xab, 0x04,0x03},返回4
 * 错误举例:1、str="03 04AB 5"有效的hex字符数量为奇数，不合法。
 * 2、str="03 04gB 5D"含有非HEX字符，不合法。
 * */
int hex_str_to_byte_arr(QString str, uint8 *byte_arr, bool direction_is_forward)
{
    str.remove(QRegularExpression("[^0-9a-fA-F]"));//只保留HEX字符

    if(str.count()%2 != 0 )
        return -1;//有效的hex字符数量为奇数，非法
    int count = str.count()/2;
    //qDebug()<<"str数目="<<str.count();
    //qDebug()<<"字节数目="<<count;
    bool ok;

    for(int i=0;i<count;i++)
    {
        if(true == direction_is_forward)//正序
            byte_arr[i] = str.mid(i<<1,2).toInt(&ok, 16);
        else//倒序
            byte_arr[count-1-i] = str.mid(i<<1,2).toInt(&ok, 16);
        if(!ok)
            return -2;//含有非HEX字符,转换失败
    }

    return count;
}
void put_be_val(quint32 val, uint8 * p, uint8 bytes)
{
    while (bytes-- > 0)
    {
        *(p + bytes) = (uint8_t)(val & 0xFF);
        val >>= 8;
    }
}

void put_le_val(quint32 val, uint8_t * p, uint8_t bytes)
{
    while (bytes-- > 0)
    {
        *p++ = (uint8_t)(val & 0xFF);
        val >>= 8;
    }
}


quint64 get_le_val(void * p, uint8_t bytes)
{
    quint64 ret = 0;

    while (bytes-- > 0)
    {
        ret <<= 8;
        ret |= *((uint8 *)p + bytes);
    }
    return ret;
}
quint64 get_be_val(uint8_t * p, uint8_t bytes)
{
    quint64 ret = 0;
    while (bytes-- > 0)
    {
        ret <<= 8;
        ret |= *p++;
    }

    return ret;
}

void print_arr(void *arr, int len)
{
    QString str = byte_num_to_hex_string_with_space((uint8 *)arr, len);
    qDebug()<<str;
    
    
    
}



